#include <iostream>
using namespace std;

/*
    拷贝构造函数的调用
      用一个对象去初始化赋值给另外一个新的对象的时候就会自动调用拷贝构造函
      数（常规的赋值不会调用拷贝构造函数）
    初始化赋值
    int n1=45;
    int n2=n1;
    常规赋值
    int n1=45;
    int n2;
    n2=n1;
*/

class Cat
{
public:
    Cat(string name, int age, float weight)
    {
        this->name = name;
        this->age = age;
        this->weight = weight;
        cout << "有参构造函数" << endl;
    }
    Cat()
    {
        cout << "无参构造函数" << endl;
    }

    Cat(const Cat &cat)
    {
        cout << "拷贝构造函数" << endl;
        this->name = cat.name;
        this->age = cat.age;
        this->weight = cat.weight;
    }

    void show()
    {
        cout << "name:" << name << endl;
        cout << "age:" << age << endl;
        cout << "weight:" << weight << endl;
    }

private:
    string name;
    int age;
    float weight;
};

int main()
{
    // 1.请问此代码中，我总共创建了几个对象   2个
    // 2.构造函数调用几次？    1次
    Cat c1("Tom", 2, 3.3);
    Cat c2 = c1; // 调用拷贝构造函数  调用的是拷贝构造函数
    // 如果程序员没有写拷贝构造函数（没有打印语句）看不到现象
    // 如果程序员自己写了拷贝构造函数，系统就不会生成拷贝构造函数,调用的是程序员自己写的拷贝构造函数

    // 常规赋值
    Cat c3;  // 调用无参构造函数
    c3 = c1; // 常规赋值，不会调用拷贝构造函数

    Cat *p = &c1;
    Cat b = *p;

    Cat &p1 = c1;
    Cat b1 = p1;
}